package main

import (
	"encoding/json"
	"log"
	"net/url"
	"time"

	"data-treating/pkg/types"

	"github.com/gorilla/websocket"
)

// WebSocket客户端演示 - 用于测试AI分析的关键点数据传输
func main() {
	// 连接参数
	personID := "test_person_001"
	taskID := "test_task_001"

	// 构建WebSocket URL
	u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/ws"}
	q := u.Query()
	q.Set("person_id", personID)
	q.Set("task_id", taskID)
	u.RawQuery = q.Encode()

	log.Printf("连接到: %s", u.String())

	// 建立WebSocket连接
	conn, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
	if err != nil {
		log.Fatal("连接失败:", err)
	}
	defer conn.Close()

	log.Printf("WebSocket连接成功建立")

	// 启动消息接收协程
	go func() {
		for {
			_, message, err := conn.ReadMessage()
			if err != nil {
				log.Printf("读取消息失败: %v", err)
				return
			}
			log.Printf("收到消息: %s", string(message))
			handleAnalysisResult(message)
		}
	}()

	// 发送测试姿势数据
	for i := 0; i < 10; i++ {
		// 创建测试姿势数据
		poseData := createTestPoseData(i)

		// 构建发送消息
		message := map[string]interface{}{
			"type":      "pose_data",
			"pose_data": poseData,
		}

		// 发送消息
		err := conn.WriteJSON(message)
		if err != nil {
			log.Printf("发送消息失败: %v", err)
			break
		}

		log.Printf("发送第%d帧姿势数据", i+1)

		// 等待1秒
		time.Sleep(1 * time.Second)
	}

	// 发送ping消息
	pingMessage := map[string]interface{}{
		"type": "ping",
	}
	err = conn.WriteJSON(pingMessage)
	if err != nil {
		log.Printf("发送ping失败: %v", err)
	}

	log.Printf("测试完成")
}

// createTestPoseData 创建测试姿势数据
func createTestPoseData(frameID int) types.PoseData {
	// 创建17个COCO关键点的测试数据
	keypoints := [17]types.Point{}

	// 设置一些基本的测试坐标
	for i := range keypoints {
		keypoints[i] = types.Point{
			X:          float64(100 + i*10 + frameID*5), // 模拟移动
			Y:          float64(200 + i*5 + frameID*2),
			Confidence: 0.8 + float64(i%3)*0.1, // 模拟不同的置信度
		}
	}

	return types.PoseData{
		Keypoints: keypoints,
		Timestamp: time.Now().UnixNano(),
		FrameID:   frameID,
	}
}

// 演示如何解析服务器返回的分析结果
func handleAnalysisResult(message []byte) {
	var response map[string]interface{}
	if err := json.Unmarshal(message, &response); err != nil {
		log.Printf("解析响应失败: %v", err)
		return
	}

	msgType, ok := response["type"].(string)
	if !ok {
		return
	}

	switch msgType {
	case "pose_analysis":
		log.Printf("收到姿势分析结果:")
		if analysis, exists := response["analysis"]; exists {
			analysisBytes, _ := json.MarshalIndent(analysis, "", "  ")
			log.Printf("分析结果: %s", string(analysisBytes))
		}
		if _, exists := response["smoothed_pose"]; exists {
			log.Printf("平滑后的姿势数据已接收")
		}
	case "history":
		log.Printf("收到历史数据")
	case "pong":
		log.Printf("收到pong响应")
	default:
		log.Printf("收到未知类型消息: %s", msgType)
	}
}
